perm filename EDGES1.SAI[PIC,HE] blob
sn#428035 filedate 1979-03-07 generic text, type T, neo UTF8
entry ALLEDGES,MNDIAG,MJDIAG;
begin "edges1"
require "<ZPRICE>bufdec.sai" source!file;
INTERNAL PROCEDURE ALLEDGES(REFERENCE INTEGER CURBUF);
BEGIN "ALLEDGES"
INTEGER I,J,K,VAL,DIR,P1,BYT,ISTOP,JSTOP,OUTBUF,THR,GOODPOINT,NGB;
OUTBUF←FNDBUF; GETBUF(ROWS(CURBUF),COLMS(CURBUF),1,OUTBUF);
OUTSTR("THRESHOLD:"); THR←CVD(INCHWL); PUTTHR(THR,CURBUF);
OUTSTR("NEIGHBORHOOD"); NGB←CVD(INCHWL);
ISTOP←ROWS(CURBUF)-(NGB+1);
JSTOP←COLMS(CURBUF)-(NGB+1);
BYT←BYTSZ(CURBUF);
FOR I←(NGB+1) THRU ISTOP DO
BEGIN
P1←INPTR(I,(NGB+1),CURBUF);
FOR J←(NGB+1) THRU JSTOP DO
BEGIN
VAL←ILDB(P1);
DIR←(VAL LSH -(BYT-2)) LAND '3;
IF (VAL←VAL LAND ('777777777777 LSH (BYT-2-36)))<THR THEN CONTINUE;
GOODPOINT←FALSE;
CASE DIR OF
BEGIN "CASE"
WHILE TRUE DO
BEGIN "HOR"
FOR K←-NGB THRU -1 DO
IF GETPNT(I+K,J,CURBUF)>VAL THEN DONE "HOR";
FOR K←1 THRU NGB DO
IF GETPNT(I+K,J,CURBUF) GEQ VAL THEN DONE "HOR";
GOODPOINT←TRUE;
DONE "HOR";
END "HOR";
WHILE TRUE DO
BEGIN "VER"
FOR K←-NGB THRU -1 DO
IF GETPNT(I,J+K,CURBUF)>VAL THEN DONE "VER";
FOR K←1 THRU NGB DO
IF GETPNT(I,J+K,CURBUF) GEQ VAL THEN DONE "VER";
GOODPOINT←TRUE;
DONE "VER";
END "VER";
WHILE TRUE DO
BEGIN "MAJ"
FOR K←-NGB THRU -1 DO
IF GETPNT(I+K,J+K,CURBUF)>VAL THEN DONE "MAJ";
FOR K←1 THRU NGB DO
IF GETPNT(I+K,J+K,CURBUF) GEQ VAL THEN DONE "MAJ";
GOODPOINT←TRUE;
DONE "MAJ";
END "MAJ";
WHILE TRUE DO
BEGIN "MIN"
FOR K←-NGB THRU -1 DO
IF GETPNT(I+K,J-K,CURBUF)>VAL THEN DONE "MIN";
FOR K←1 THRU NGB DO
IF GETPNT(I+K,J-K,CURBUF) GEQ VAL THEN DONE "MIN";
GOODPOINT←TRUE;
DONE "MIN";
END "MIN"
END "CASE";
IF GOODPOINT THEN PUTPNT(I,J,1,OUTBUF);
END;
END;
FREBUF(CURBUF); CURBUF←OUTBUF;
END "ALLEDGES";
INTERNAL PROCEDURE MNDIAG(INTEGER OBUF,CURBUF,THR,NOISE);
BEGIN "MNDIAG"
INTEGER I,J,NV,LV,ISTOP,JSTOP,VAL1;
ISTOP←ROWS(OBUF); JSTOP←COLMS(OBUF);
BEGIN
INTEGER ARRAY VAL,COORDI,COORDJ,OVAL,LEVEL [1:JSTOP];
BOOLEAN ARRAY STATE [1:JSTOP];
FOR J←1 THRU JSTOP DO
BEGIN
STATE[J]←TRUE;
VAL[J]←COORDI[J]←COORDJ[J]←OVAL[J]←LEVEL[J]←0; END;
FOR I←1 THRU ISTOP DO
BEGIN
FOR J←JSTOP DOWNTO 2 DO
BEGIN
VAL[J]←VAL[J-1];
COORDI[J]←COORDI[J-1];
COORDJ[J]←COORDJ[J-1];
OVAL[J]←OVAL[J-1];
STATE[J]←STATE[J-1];
LEVEL[J]←LEVEL[J-1];
END;
VAL[1]←COORDI[1]←COORDJ[1]←OVAL[1]←STATE[1]←LEVEL[1]←0;
FOR J←1 THRU JSTOP DO
BEGIN "CALC"
LV←OVAL[J];
NV←GETPNT(I,J,OBUF);
OVAL[J]←NV;
IF STATE[J] THEN
IF NV<LV THEN
BEGIN
IF (VAL[J]-NV)>NOISE THEN
BEGIN
STATE[J]←FALSE;
IF VAL[J]>THR THEN PUTPNT((COORDI[J]+LEVEL[J]%2),(COORDJ[J]+LEVEL[J]%2),VAL[J],CURBUF);
LEVEL[J]←0;
END
END
ELSE IF NV>LV THEN
BEGIN
COORDI[J]←I;
COORDJ[J]←J;
VAL[J]←NV;
LEVEL[J]←0;
END
ELSE LEVEL[J]←LEVEL[J]+1
ELSE IF NV>LV THEN
BEGIN
STATE[J]←TRUE;
COORDI[J]←I;
COORDJ[J]←J;
VAL[J]←NV;
END;
END "CALC";
ROWCHK(CHKROW,ROWS,I,50);
END;
END;
END "MNDIAG";
INTERNAL PROCEDURE MJDIAG(INTEGER OBUF,CURBUF,THR,NOISE);
BEGIN "MJDIAG"
INTEGER I,J,NV,LV,ISTOP,JSTOP,VAL1;
ISTOP←ROWS(OBUF); JSTOP←COLMS(OBUF);
BEGIN
INTEGER ARRAY VAL,COORDI,COORDJ,OVAL,LEVEL [1:JSTOP];
BOOLEAN ARRAY STATE [1:JSTOP];
FOR J←1 THRU JSTOP DO
BEGIN
STATE[J]←TRUE;
VAL[J]←COORDI[J]←COORDJ[J]←OVAL[J]←LEVEL[J]←0; END;
FOR I←1 THRU ISTOP DO
BEGIN
FOR J←1 THRU JSTOP-1 DO
BEGIN
VAL[J]←VAL[J+1];
COORDI[J]←COORDI[J+1];
COORDJ[J]←COORDJ[J+1];
OVAL[J]←OVAL[J+1];
STATE[J]←STATE[J+1];
LEVEL[J]←LEVEL[J+1];
END;
VAL[JSTOP]←COORDI[JSTOP]←COORDJ[JSTOP]←OVAL[JSTOP]←STATE[JSTOP]←LEVEL[JSTOP]←0;
FOR J←1 THRU JSTOP DO
BEGIN "CALC"
LV←OVAL[J];
NV←GETPNT(I,J,OBUF);
OVAL[J]←NV;
IF STATE[J] THEN
IF NV<LV THEN
BEGIN
IF (VAL[J]-NV)>NOISE THEN
BEGIN
STATE[J]←FALSE;
IF VAL[J]>THR THEN PUTPNT((COORDI[J]+LEVEL[J]%2),(COORDJ[J]-LEVEL[J]%2),VAL[J],CURBUF);
LEVEL[J]←0;
END
END
ELSE IF NV>LV THEN
BEGIN
COORDI[J]←I;
COORDJ[J]←J;
VAL[J]←NV;
LEVEL[J]←0;
END
ELSE LEVEL[J]←LEVEL[J]+1
ELSE IF NV>LV THEN
BEGIN
STATE[J]←TRUE;
COORDI[J]←I;
COORDJ[J]←J;
VAL[J]←NV;
END;
END "CALC";
ROWCHK(CHKROW,ROWS,I,50);
END;
END;
END "MJDIAG";
end "edges1";